home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / unarced / utilities / shells / csh / run.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  6KB  |  274 lines

  1.  
  2. /*
  3.  * RUN.C
  4.  *
  5.  * (c)1986 Matthew Dillon     9 October 1986
  6.  *
  7.  *    RUN   handles running of external commands.
  8.  *
  9.  * Version 2.07M by Steve Drew 10-Sep-87
  10.  * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  11.  * Version 5.00L by Urban Mueller 17-Feb-91
  12.  *
  13.  */
  14.  
  15. #include "shell.h"
  16.  
  17. int MySyncRun( char *com, char *args, BPTR in, BPTR out, int nosync );
  18. int echofunc(void);
  19.  
  20. int
  21. do_run( char *str, int nosync )
  22. {
  23.     int retcode;
  24.     char buf[200];        /* enough space for 100 char cmd name + path stuff */
  25.     char *path, *path2, *argline, *copy, *ext, *end;
  26.  
  27.     if( !*av[0] )
  28.         return 0;
  29.  
  30.     if( (retcode=echofunc())>=0 )
  31.         return retcode;
  32.  
  33.     a0tospace( av[0] );                                 /* allow "com mand" */
  34.  
  35.     argline=compile_av(av, 1, ac, ' ', 1);
  36.  
  37.     if (strlen(av[0]) > 100) { ierror(NULL,509); return -1; }
  38.  
  39.     if( ac==1 && isdir(av[0])) {
  40.         sprintf(buf,"cd \"%s\"",av[0]);
  41.         return execute( buf );
  42.     }
  43.  
  44.     IoError=IoErr();
  45.     if( (IoError==218 || IoError==225 || IoError==226) && index(av[0],':')) {
  46.         ierror( av[0], IoError );
  47.         return 20;
  48.     }
  49.  
  50.     sprintf(buf,"res_%s",BaseName(av[0]));               /* delayed residents */
  51.     if (o_resident && Getenv(buf, buf+100, 90L)) {
  52.         Setenv(buf,NULL);
  53.         loadres(buf+100);
  54.     }
  55.  
  56.     if( (retcode=MySyncRun(av[0],argline,0,0,nosync))>=0 )   /* AmigaDOS path */
  57.         goto done2;
  58.  
  59.     if( retcode==PR_NOMEM ) {
  60.         ierror( av[0], 103 );
  61.         return 20;
  62.     }
  63.  
  64.     IoError=IoErr();
  65.     if( (IoError==218 || IoError==225 || IoError==226) && index(av[0],':')) {
  66.         ierror( av[0], IoError );
  67.         return 20;
  68.     }
  69.  
  70.     if (path = dofind(av[0],"",buf+80,v_path)) {             /* shell path    */
  71.         DPTR *dp;
  72.         BPTR fh;
  73.         int stat, script;
  74.         if((retcode = MySyncRun(path,argline,0,0,nosync))>=0)
  75.             goto done2;
  76.         if(dp=dopen(path,&stat)) {
  77.             script= dp->fib->fib_Protection&FIBF_SCRIPT;
  78.             dclose(dp);
  79.             if( !stat && script ) {
  80.                 char *t;
  81.                 buf[0]=0;
  82.                 if( fh=Open(path,MODE_OLDFILE )) {
  83.                     Read(fh,buf,79);
  84.                     Close(fh);
  85.                     if(t=index(buf,'\n')) *t=0;
  86.                 }
  87.                 if( buf[0]=='/' && buf[1]=='*' ) {
  88.                     sprintf(buf, "Rx %s", str );
  89.                 } else if( (buf[0]!=';' || buf[0]!='#') && buf[1]=='!' ) {
  90.                     memmove(buf,buf+2,strlen(buf+2)+1);
  91.                     strcat( buf," ");
  92.                     strcat( buf,str);
  93.                 } else {
  94.                     sprintf(buf,"Execute %s", str );
  95.                 }
  96.                 return execute( a0tospace(buf));
  97.             }
  98.         }
  99.     }
  100.  
  101.     if(!(end=rindex(av[0],'.'))) end="";               /* automatic sourcing */
  102.     ext=strcmp(end,".sh") ? ".sh" : "";
  103.     if (path = dofind(av[0],ext,buf,v_path)) {
  104.         av[1] = buf;
  105.         copy = salloc(strlen(str)+3);
  106.         sprintf(copy,"x %s",str);
  107.         retcode = do_source(copy);
  108.         goto done;
  109.     }
  110.  
  111.     copy=salloc(strlen(av[0])+strlen(argline)+5);
  112.     sprintf(copy,"%s %s",av[0],argline);
  113.  
  114.     ext=strcmp(end,".rexx") ? ".rexx" : "";           /* automatic rx-ing   */
  115.     if( path = dofind(av[0], ext, buf, v_rxpath )) {
  116.         strcat (path," ");
  117.         if( strlen(argline)>140 ) argline[140]=0;
  118.         strcat (path,argline);
  119.  
  120. /*        strncpy(path+strlen(path),argline,190); */
  121.         if( (retcode=MySyncRun("rx",path,0,0,0)) >=0 ) goto done;
  122.         if (path2 = dofind("rx","",buf+160,v_path)) {
  123.             retcode = MySyncRun(path2,path,0,0,0);
  124.             goto done;
  125.         }
  126.  
  127.     }
  128.  
  129.     if( !doaction(av[0],"exec",argline)) {
  130.         retcode=0;
  131.         goto done;
  132.     }
  133.  
  134.     retcode=-1;
  135.     fprintf(stderr,"Command not found %s\n",av[0]);
  136.  
  137. done:
  138.     free( copy );
  139. done2:
  140.     setioerror( IoErr() );
  141.     free( argline );
  142.     return retcode;
  143. }
  144.  
  145. struct Segment {
  146.     BPTR NextEntry;
  147.     LONG UseCount;
  148.     BPTR SegPtr;
  149.     BSTR SegName;
  150. };
  151.  
  152. int
  153. MySyncRun( char *com, char *args, BPTR in, BPTR out, int nosync )
  154. {
  155.     struct Segment *seg;
  156.     int ret, len=strlen(args);
  157.     char buf2[200], *buf=buf2;
  158.     long oldname;
  159.  
  160. #ifdef KICK20
  161.     if( o_kick20 ) {
  162.         oldname = (long)Mycli->cli_CommandName;
  163.  
  164.         args[len]='\n'; args[len+1]=0;
  165.  
  166.         while( (long)buf & 3 ) buf++;
  167.         buf[0] = strlen( com );
  168.         strncpy(buf+1,com,80);
  169.  
  170.         Forbid();
  171.         if(seg=FindSegment( (UBYTE *)com, NULL, 0 ))
  172.             seg->UseCount++;
  173.         Permit();
  174.         if( seg ) {
  175.             Mycli->cli_CommandName = (long)buf/4;
  176.  
  177.             ret=RunCommand(seg->SegPtr, Mycli->cli_DefaultStack,
  178.                                        (UBYTE *)args, strlen(args));
  179.             seg->UseCount--;
  180.             Mycli->cli_CommandName = (long)oldname;
  181.             return ret;
  182.         }
  183.  
  184.         if( o_internal ) {
  185.             Forbid();
  186.             seg=FindSegment( (UBYTE *)com, NULL, 1 );
  187.             Permit();
  188.             if( seg && seg->UseCount==-2 ) {
  189.                 Mycli->cli_CommandName = (long)buf/4;
  190.  
  191.                 ret=RunCommand(seg->SegPtr, Mycli->cli_DefaultStack,
  192.                                            (UBYTE *)args, strlen(args));
  193.                 Mycli->cli_CommandName = (long)oldname;
  194.                 return ret;
  195.             }
  196.         }
  197.  
  198.         args[len]=0;
  199.  
  200.     }
  201. #endif
  202.  
  203.     if( nosync ) {
  204.         sprintf(buf2,"%s %s",com,args);
  205.         Execute(buf2,0,Myprocess->pr_COS);
  206.         return 0;
  207.     }
  208.  
  209.     if( (ret= SyncRun( com, args, in, out ))>=0 )
  210.         return ret;
  211.  
  212.     if( ret==PR_NOMEM ) {
  213.         ierror(NULL,103);
  214.         return 20;
  215.     }
  216.  
  217.     return -1;
  218. }
  219.  
  220. #if 0
  221. int
  222. do_which( char *str )
  223. {
  224.     char *got, *com=av[1];
  225.  
  226.     if( get_var(LEVEL_ALIAS,com) ) {
  227.         printf("Shell Alias '%s'\n",com);
  228.         return 0;
  229.     }
  230.  
  231.     if( *(got=find_internal( com ))>1 ) {
  232.         printf("Shell Internal '%s'\n",got);
  233.         return 0;
  234.     }
  235.  
  236.  
  237.  
  238.     printf( "Not found\n" );
  239.     return 20;
  240. }
  241. #endif
  242.  
  243.  
  244. char *
  245. dofind( char *cmd, char *ext, char *buf, char *path)
  246. {
  247.     char *ptr, *s=path, *ret=NULL;
  248.  
  249.     Myprocess->pr_WindowPtr = (APTR)(-1);
  250.     sprintf(buf,"%s%s",cmd,ext);
  251.     if (exists(buf)) {
  252.         ret=buf;
  253.         goto terminate;
  254.     }
  255.     if ((char*)BaseName(buf)==buf) {
  256.         if( *path=='_' )
  257.             s = get_var(LEVEL_SET, path);
  258.         while (*s) {
  259.             for (ptr=buf; *s && *s!=','; ) *ptr++ = *s++;
  260.             if( ptr[-1]!=':' && ptr[-1]!='/')
  261.                 *ptr++='/';
  262.             sprintf(ptr, "%s%s", cmd, ext);
  263.             if (exists(buf)) {
  264.                 ret=buf;
  265.                 goto terminate;
  266.             }
  267.             if (*s) s++;
  268.         }
  269.     }
  270. terminate:
  271.     Myprocess->pr_WindowPtr = (APTR)o_noreq;
  272.     return ret;
  273. }
  274.